App = {
  web3Provider: null,
  contracts: {},

  init: function() {
    // Load pets.
    $.getJSON('../pets.json', function(data) {
      var petsRow = $('#petsRow');
      var petTemplate = $('#petTemplate');

      for (i = 0; i < data.length; i ++) {
        petTemplate.find('.panel-title').text(data[i].name);
        petTemplate.find('img').attr('src', data[i].picture);
        petTemplate.find('.pet-breed').text(data[i].breed);
        petTemplate.find('.pet-age').text(data[i].age);
        petTemplate.find('.pet-location').text(data[i].location);
        petTemplate.find('.btn-adopt').attr('data-id', data[i].id);

        petsRow.append(petTemplate.html());
      }
    });

    return App.initWeb3();
  },

  initWeb3: function() {
    /*
     * Replace me...
     */
  
	var url = 'http://127.0.0.1:8545';
	if( typeof web3 !== 'undefined' ) {
		App.web3Provider = web3.currentProvider;
	} else {
		App.web3Provider = new Web3.providers.HttpProvider(url);
	}

	web3 = new Web3(App.web3Provider);

    return App.initContract();
  },

  initContract: function() {
    /*
     * Replace me...
     */
	$.getJSON('Adoption.json', function(data) {
		var AdoptionArtifact = data;
		let contract = TruffleContract(AdoptionArtifact);
		App.contracts.Adoption = contract;

		App.contracts.Adoption.setProvider(App.web3Provider);
		return App.markAdopted();
	});

    return App.bindEvents();
  },

  bindEvents: function() {
    $(document).on('click', '.btn-adopt', App.handleAdopt);
  },

  markAdopted: function(adopters, account) {
    /*
     * Replace me...
     */
	var adoptionInstance;

	App.contracts.Adoption.deployed().then(function(instance) {
		console.log("instance: ", instance);
		adoptionInstance = instance;

		return adoptionInstance.getAdopters.call();
	}).then(function(adopters) {
		console.log("adopters: ", adopters);
		for(var i = 0; i < adopters.length; i++) {
			if(adopters[i] !== '0x0000000000000000000000000000000000000000') {
				$('.panel-pet').eq(i).find('button').text('Success').attr('disabled', true);
			}
		}
	}).catch(function(err) {
		console.error(err.message);
	});
  },

  handleAdopt: function(event) {
    event.preventDefault();

	var petId = parseInt($(event.target).data('id'));
	console.log(petId);
	
    /*
     * Replace me...
     */
	var adoptionInstance;

	web3.eth.getAccounts(function(error, accounts) {
		console.log("accounts: ", accounts);
		if(error) {
			console.log(error);
		}

		var account = accounts[0];

		App.contracts.Adoption.deployed().then(function(instance) {
			adoptionInstance = instance;

			return adoptionInstance.adopt(petId, {from: account});
		}).then(function(result) {
			return App.markAdopted();
		}).catch(function(err) {
			console.error(err.message);
		});
	});
  }

};

$(function() {
  $(window).load(function() {
    App.init();
  });
});
